// filename: producer.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <semaphore.h>
#include <fcntl.h>

#define SHM_SIZE 1024
#define SEM_NAME "/my_semaphore1"
#define BUFFER_SIZE 100
int main() {
    key_t key = ftok("producer.c", 65);
    int shmid;
    char *shmaddr;
    sem_t *semaphore;
    // 创建共享内存
    if ((shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666)) == -1) {
        perror("shmget");
        exit(1);
    }
    // 附加共享内存
    shmaddr = shmat(shmid, (void*)0, 0);
    if (shmaddr == (char*)-1) {
        perror("shmat");
        exit(1);
    }
    // 创建信号量（如果不存在）
    semaphore = sem_open(SEM_NAME, O_CREAT, 0644, 1);
    if (semaphore == SEM_FAILED) {
        perror("sem_open");
        exit(1);
    }
    // 生产数据
    for(int i = 0; i < BUFFER_SIZE; ++i) {
        sprintf(shmaddr + (i * sizeof(char)*10), "Item %d", i+1);
        printf("Produced: Item %d\n", i+1);
        sem_post(semaphore); // 数据生产后，释放信号量
        sleep(1); // 模拟生产间隔
    }
    // 清理
    shmdt(shmaddr);
    shmctl(shmid, IPC_RMID, NULL); // 实际应用中考虑是否需要删除共享内存
    sem_close(semaphore);
    sem_unlink(SEM_NAME);
    return 0;
}